package com.hsgene.product.persistence;

import com.hsgene.common.util.support.LimitHelper;
import com.hsgene.common.util.support.OrderHelper;
import com.hsgene.order.domain.applets.AppletsOrderPackageInfoDto;
import com.hsgene.product.condition.CommodityCondition;
import com.hsgene.product.domain.GeneticTestingPackageAddtion;
import com.hsgene.product.dto.GeneticTestingCommodityItemDto;
import com.hsgene.product.dto.wechat.SimpleCommodityDto;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * 商品Repository
 *
 * @author wangbing
 * @version 1.0, 2018/10/11
 */
@Repository
public interface CommodityRepository {


    /**
     * @param packageId 商品id
     * @param userId    用户id
     * @return int
     * @description 根据商品id查询基因检测数量
     * @author maodi
     * @createDate 2018/10/29 14:16
     */
    int getProductCountByPackageIdAndUserId(@Param("packageId") String packageId, @Param("userId") String userId);

    /**
     * 查询符合条件的商品数量
     *
     * @param condition 查询条件
     * @return 商品数量
     */
    int queryCommodityCount(@Param("condition") CommodityCondition condition);

    /**
     * 查询符合条件的商品列表
     *
     * @param condition   查询条件
     * @param orderHelper 排序参数
     * @param limitHelper 分页参数
     * @return 商品列表
     */
    List<SimpleCommodityDto> querySimpleCommodity(
            @Param("condition") CommodityCondition condition,
            @Param("orderHelper") OrderHelper orderHelper,
            @Param("limitHelper") LimitHelper limitHelper);

    /**
     * 查询符合条件的商品Items
     *
     * @param condition   查询条件
     * @param orderHelper 排序参数
     * @param limitHelper 分页参数
     * @return 商品Items
     */
    List<GeneticTestingCommodityItemDto> queryCommodityItems(
            @Param("condition") CommodityCondition condition,
            @Param("orderHelper") OrderHelper orderHelper,
            @Param("limitHelper") LimitHelper limitHelper);

    /**
     * @param userId      用户id
     * @param limitHelper 分页条件
     * @return java.util.List<com.hsgene.product.dto.wechat.SimpleCommodityDto>
     * @description 获取购物车商品列表信息
     * @author maodi
     * @createDate 2018/10/17 13:39
     */
    List<SimpleCommodityDto> getShoppingCarCommodityList(@Param("userId") String userId, @Param("limitHelper")
            LimitHelper limitHelper);

    /**
     * @param userId 用户id
     * @return int
     * @description 获取购物车商品数量
     * @author maodi
     * @createDate 2018/10/17 13:40
     */
    int getShoppingCarCommodityCount(@Param("userId") String userId);

    /**
     * @param userId 用户id
     * @param ids    商品id数组
     * @return java.util.List<com.hsgene.product.dto.wechat.SimpleCommodityDto>
     * @description 根据商品id数组获取购物车商品信息
     * @author maodi
     * @createDate 2018/10/17 15:00
     */
    List<SimpleCommodityDto> getShoppingCarCommodityListByIds(@Param("userId") String userId, @Param("ids") String[]
            ids);

    /**
     * @param userId 用户id
     * @param ids    商品id数组
     * @return java.util.Map<java.lang.String.Object>
     * @description 根据商品id数组获取购物车商品结算信息
     * @author maodi
     * @createDate 2018/10/17 15:17
     */
    Map<String, Object> getShoppingCarCommodityBalanceByIds(@Param("userId") String userId, @Param("ids") String[] ids);

    /**
     * 根据套餐id查询商品信息
     *
     * @param packageId 套餐id
     * @return 套餐商品附加信息
     */
    GeneticTestingPackageAddtion findByPackageId(@Param("packageId") String packageId);

    /**
     * 保存商品附加信息
     *
     * @param addtion 商品附加信息
     */
    void saveCommodity(@Param("addtion") GeneticTestingPackageAddtion addtion);

    /**
     * 更新商品信息
     *
     * @param addtion 商品附加信息
     */
    void updateCommodity(@Param("addtion") GeneticTestingPackageAddtion addtion);

    /**
     * @param userId 用户id
     * @param ids    商品id数组
     * @return java.util.List<com.hsgene.order.domain.applets.AppletsOrderPackageInfoDto>
     * @description 根据商品id数组获取小程序订单商品信息
     * @author maodi
     * @createDate 2018/10/18 11:27
     */
    List<AppletsOrderPackageInfoDto> getAppletsOrderPackageInfoDtosByIds(@Param("userId") String userId, @Param("ids")
            String[] ids);

    /**
     * 标记商品已被使用
     *
     * @param packageId 商品套餐id
     */
    void updateUsed(@Param("packageId") String packageId);

    /**
     * 标记商品已被使用(批量)
     *
     * @param ids
     * @return
     * @author FX
     * @date 2018/12/20 14:19
     */
    void updateUsedMore(@Param("ids") List<String> ids);

    /**
     * 类目名称修改后更新商品冗余类目名称字段
     *
     * @param categoryId      类目id
     * @param newCategoryName 新类目名称
     */
    void updateCategoryName(
            @Param("categoryId") String categoryId,
            @Param("newCategoryName") String newCategoryName);
}
